home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
apl
/
tvv132.lzh
/
textview.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-22
|
7KB
|
335 lines
/*
MicroView.win Copyright 1995 小笠原博之
oga@dgw.yz.yamagata-u.ac.jp
*/
#include "microview.h"
#define Ctrl(a) ((a)&0x1f)
#define EVENTA (EventOpenON \
|EventRedrawON \
|EventCloseON \
|EventIconifyON \
|EventResizeON \
|EventKeyON \
|EventUserON \
|EventMouseSwitchON )
#define EVENTB (EventOpenON \
|EventRedrawON \
|EventCloseON \
|EventMouseSwitchON )
int GlobalCount= 0;
static void
SendString( prog, str, info )
char *prog, *str;
EventInfo *info;
{
info->option= EventUser;
info->ComData= UserString;
info->ComBuffer= str;
PidSendEvent( prog, info, TRUE );
}
static void
ExecProgram( prog, opt, str )
char *prog, *opt, *str;
{
WindowID dp= DialogMessageOpen( "ロード中",
AttrDefault|AttrHighLight );
char buf[128];
s_strcpy( buf, opt );
s_strcat( buf, " " );
s_strcat( buf, str );
WindowLoadExec( prog, buf, 0, 0 );
WindowClose( dp );
}
static void
DrawCurpos( i, rv, bp )
T_BUFP *bp;
{
if( i >= 0 ){
unsigned char *p= bp->lp[i];
int attr, font, xoff, opt;
if( !p[3] )
return;
font= *p++;
if( font >= 8 ){
DrawBuf dbuf[1];
opt= *p++-1;
attr= *p++;
xoff= opt&0xfc;
if( xoff == 248 ){
xoff= (HS_WindowGetViewSizeX(bp->bwp)-
strlen(p)*font/2)/2;
}
DrawSetSymbol( dbuf, xoff+5, i*bp->font_z + (opt?2:0),
p, rv ? attr^AttrReverse :
attr, font );
WindowDraw( bp->bwp, dbuf, 1 );
}
}
}
static
EventExecB( wp, info )
WindowID wp;
EventInfo *info;
{
DrawBuf dbuf[ 120+1 ];
T_BUFP *bp= HS_WindowGetClientPointer(wp);
switch( info->option ){
case EventOpen:
WindowSetEventAttr( wp, EVENTB );
return TRUE;
case EventRedraw: {
int dc= 1,
i= info->y;
unsigned int y, yy;
unsigned char **ptr;
ShadowInit();
DrawSetClear( dbuf, bp->backattr );
if( i/= bp->font_z )
i--;
ptr= bp->lp+i;
y= i* bp->font_z;
yy= info->v+ y+ bp->font_z+ bp->font_z;
for(; y< yy && i < bp->line ; y+= bp->font_z, i++ ){
unsigned char *p= *ptr++;
int attr, font, xoff, opt;
if( !p[3] )
continue;
font= *p++;
opt= *p++-1;
attr= *p++;
if( i == bp->curpos )
attr^= AttrReverse;
if( font < 48 ){
xoff= opt&0xfc;
if( xoff == 248 ){
xoff= (HS_WindowGetViewSizeX(wp)-
strlen(p)*font/2)/2;
}
switch( opt&3 ){
case 0:
DrawSetSymbol( dbuf+dc++, xoff, y,
p, attr, font );
break;
case 1:
{
Sheet *sp;
_shadow:
sp= (Sheet*)SheetShadow( p,attr,font);
if( !sp ){
WindowDraw( wp, dbuf, dc );
dc= 0;
goto _shadow;
}
DrawSetPut( dbuf+dc++, xoff, y, sp );
}
break;
case 2:
case 3:
if( font >= 8 )
DrawSetSymbol( dbuf+dc++,
xoff+5, y+2,
p, attr, font );
DrawSetLine( dbuf+dc++, xoff+3, y,
xoff+strlen(p)*font/2+8,
y+font+4,
opt&1, OptionShadow );
break;
}
}else{
switch( font ){
case 50:
case 51:
attr += attr;
opt += opt;
case 48:
case 49:
DrawSetLine( dbuf+dc++, attr, y,
opt, y+2,
font&1, OptionShadow );
break;
}
}
}
WindowDraw( wp, dbuf, dc );
return TRUE;
}
case EventClose:
WindowClose( wp );
return TRUE;
case EventMouseSwitch:
if( info->LeftON ){
int i= info->y/bp->font_z;
if( i >= 0 && i < bp->line ){
char *p;
_RRR:
for( p= bp->lp[i]+3 ; *p++ ;);
if( !*p ){
i--;
goto _RRR;
}
if( *p >= 'A' && *p <= 'z' ){
DrawCurpos( bp->curpos, FALSE, bp );
DrawCurpos( bp->curpos= i, TRUE, bp );
}
/***/
switch( *p ){
case 'E': {
WindowID dp= DialogMessageOpen(
"ロード中",
AttrDefault|AttrHighLight );
char exec[80];
p= p_strcpych( ' ', exec, p+1 );
WindowLoadExec( exec, p, 0, 0 );
WindowClose( dp );
}
break;
case 'V': {
WindowID dp= DialogMessageOpen(
"ロード中",
AttrDefault|AttrHighLight );
BPopen( p+1 );
WindowClose( dp );
}
break;
case 'K': {
int pid= 0;
if( !p[1] )
WindowSendSignal( 0, SignalKill, NULL );
else for(; pid= PidSearch( p+1, pid+1 );)
WindowSendSignal( pid, SignalKill, NULL );
}
break;
case 'U': {
char exec[80];
p= p_strcpych( ',', exec, p+1 );
SendString( exec, p+1, info );
}
break;
case 'p': {
char exec[80], opt[80];
p= p_strcpych( ',', exec, p+1 );
p= p_strcpych( ',', opt, p+1 );
if( PidSearch( exec, 0 ) ){
SendString( exec, p+1, info );
}else
ExecProgram( exec, opt, p+1 );
}
break;
case 'C':
info->option= EventClose;
WindowSendEvent( bp->awp, info );
break;
}
/***/
}
}
return TRUE;
}
return FALSE;
}
static
EventExecA( wp, info )
WindowID wp;
EventInfo *info;
{
DrawBuf dbuf[10];
T_BUFP *bp= HS_WindowGetClientPointer(wp);
switch( info->option ){
case EventOpen:
WindowSetEventAttr( wp, EVENTA );
return TRUE;
case EventRedraw: {
int x= HS_WindowGetViewSizeX(wp),
y= HS_WindowGetViewSizeY(wp);
DrawSetLine( dbuf, x-10, y-10, x, y, ColorGray,
OptionFill );
WindowDraw( wp, dbuf, 1 );
WindowRedraw( bp->bwp );
}
return TRUE;
case EventClose:
WindowClose( wp );
if( bp->fbuf )
MFREE( bp->fbuf );
if( bp->lp )
MFREE( bp->lp );
free( bp );
if( !--GlobalCount )
WindowConnectionClose();
return TRUE;
case EventMouseSwitch:
if( info->LeftON ){
if( info->x >= HS_WindowGetViewSizeX( wp )-10
&& info->y >= HS_WindowGetViewSizeY( wp )-10 )
WindowResizeOperation( wp, info );
else
WindowSendEvent( bp->bwp, info );
return TRUE;
}
break;
case EventResize:
WindowResize( bp->bwp, 0, 0, info->h, info->v );
WindowResize( wp, info->x, info->y, info->h, info->v );
return TRUE;
case EventIconify:
IconEnt( wp, bp->title, AttrDefault, 12 );
return TRUE;
case EventUser:
switch( info->ComData ){
case UserStrings: {
unsigned char **p= info->ComBuffer;
for(; *p ; BPopen( *p++ ) );
}
break;
case UserPaste:
case UserString:
BPopen( info->ComBuffer );
}
info->ComData= -1;
return TRUE;
case EventKey:
KeyExec( info, bp );
return TRUE;
}
return FALSE;
}
void
MV_Open( x, y, h, v, bp )
T_BUFP *bp;
{
bp->awp= WindowTitleOpen( x, y, h, v, NULL, bp->title,
Icon|Resize|Close|Push, EventExecA );
bp->bwp= WindowScrollOpen( 0, 0,
HS_WindowGetViewSizeX(bp->awp),
HS_WindowGetViewSizeY(bp->awp),
bp->awp,
bp->maxcol* bp->font_x,
bp->line*bp->font_z,
DirectionY|DirectionX,
16, bp->font_z*2, EventExecB );
HS_WindowGetClientPointer(bp->awp)=
HS_WindowGetClientPointer(bp->bwp)= bp;
WindowRedraw( bp->awp );
GlobalCount++;
}